package com.aleyn.processor.data

import com.google.devtools.ksp.symbol.KSPropertyDeclaration

/**
 * @author : Aleyn
 * @date : 2023/07/23 : 17:42
 *
 * 定义了 LRouter 框架在编译期处理时使用的核心元数据结构。
 * 这是一个密封类，包含了描述路由、模块和依赖注入所需的所有信息。
 */
sealed class RouterMeta {

    /**
     * 代表一个独立的路由信息，通常由 `@Route` 注解生成。
     *
     * @property path 路由路径，是路由的唯一标识符。
     * @property desc 路由的描述信息。
     * @property other 额外的标志位或数据。
     * @property className 目标页面或组件的完全限定类名。
     */
    data class ModuleRouter(
        var path: String = "",
        var desc: String = "",
        var other: Int = 0,
        var className: String = ""
    ) : RouterMeta()

    /**
     * 代表一个 Gradle 模块中所有与路由和依赖注入相关的信息集合。
     *
     * 这是为每个模块生成 `LRouter$$` 注册类的核心数据模型。
     *
     * @property router 当前模块中所有路由 (`@Route`) 的列表。
     * @property definitions 当前模块中所有依赖注入定义 (`@Single`, `@Factory` 等) 的列表。
     */
    data class Module(
        val router: List<ModuleRouter>,
        val definitions: List<Definition>
    ) : RouterMeta()

    /**
     * 代表一个需要进行依赖注入的类（通常是 Activity 或 Fragment）的信息。
     *
     * 这是为每个需要注入的类生成 `$$Inject` 辅助类的核心数据模型。
     *
     * @property pkgName 目标类的包名。
     * @property simpleName 目标类的简单名称。
     * @property list 目标类中所有被 `@Autowired` 注解标记的属性列表。每个元素是一个 Pair，包含属性名和其 KSP 声明。
     */
    data class RouterAutowired(
        val pkgName: String,
        val simpleName: String,
        val list: List<Pair<String, KSPropertyDeclaration>>
    ) : RouterMeta()

}

